/*
题目：编写一个函数，该函数将一个十六进制数值字符串转换为二进制数值字符串。编程思
路bin2Hex .c，仅仅是一个互逆的操作。需要使用字符串数组来保存十六和二进制的映射
关系。函数头：char* hex2Bin (char hexStr []) //hexStr表示要转换的十六进制字符串
输入样例：	
hex2Bin ("7F");
输出样例：	
1111111(2)
*/
#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
  
char* hex2Bin(char hexStr[]);  
  
int main() {  
    char hexStr[] = "7F";  
    char* binStr = hex2Bin(hexStr);  
    printf("%s(2)\n", binStr);  
    free(binStr);  // 释放动态分配的内存  
    return 0;  
}  
  
char* hex2Bin(char hexStr[]) {  
    // 十六进制到二进制的映射  
    const char* hexToBin[] = {  
        "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111",  
        "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"  
    };  
      
    int len = strlen(hexStr);  
    // 为二进制字符串动态分配内存，每个十六进制字符转换为4个二进制字符  
    char* binStr = (char*)malloc(4 * len + 1);  // +1 用于存储字符串的终止符 '\0'  
    if (!binStr) {  
        fprintf(stderr, "Memory allocation failed.\n");  
        exit(EXIT_FAILURE);  
    }  
      
    binStr[0] = '\0';  // 初始化二进制字符串为空字符串  
    for (int i = 0; i < len; i++) {  
        char hexChar = toupper(hexStr[i]);  // 转换为大写以便比较  
        if (hexChar >= '0' && hexChar <= '9') {  
            strcat(binStr, hexToBin[hexChar - '0']);  // 数字字符转换为对应的索引  
        } else if (hexChar >= 'A' && hexChar <= 'F') {  
            strcat(binStr, hexToBin[hexChar - 'A' + 10]);  // 字母字符转换为对应的索引  
        } else {  
            fprintf(stderr, "Invalid hexadecimal character: %c\n", hexChar);  
            free(binStr);  // 释放已分配的内存  
            exit(EXIT_FAILURE);  
        }  
    }  
      
    return binStr;  // 返回二进制字符串的指针  
}